<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta http-equiv="X-UA-Compatible" content="IE=edge" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>Document</title>
  </head>
  <body>
    <script>
      /*
        深浅克隆或深浅拷贝
          1. 深浅克隆有什么区别？
            浅克隆：基本类型克隆值，引用类型克隆地址值。
              问题：源对象和克隆新对象的引用类型还是同一个地址，修改这个数据都会发生变化
            深克隆：将所有值全都克隆新的，不会有上述问题

          2. 有哪些是浅克隆？
            Object.assign()
            arr.slice()
            [...arr]

          3. 有哪些是深克隆？
            JSON.parse(JSON.stringify(xxx)) : 函数、日期等类型没法克隆
            自定义实现深克隆: 函数、日期等类型没法克隆
            lodash/cloneDeep 
      */

      function checkType(target) {
        return Object.prototype.toString.call(target).slice(8, -1);
      }

      function clone(target) {
        let result;
        const type = checkType(target);
        if (type === "Object") {
          result = {};
        } else if (type === "Array") {
          result = [];
        } else {
          return target;
        }

        for (const key in target) {
          result[key] = clone(target[key]);
        }

        return result;
      }
    </script>
  </body>
</html>
